//
// Created by 15548 on 2025/2/17.
//

#ifndef CHESSBOTBOARD_22_MIDDLE_H
#define CHESSBOTBOARD_22_MIDDLE_H

#include <vector>
#include <map>

// 声明全局变量（extern 表示这些变量在其他地方定义）
extern char rotatedArr[10][10];  // 存储旋转后的二维数组
extern char finalArr[10][10];    // 存储旋转并水平翻转后的二维数组
extern char arr2D[10][10];       // 存储原始的二维数组
extern String charArray[10][10]; // 存储二维 String 数组
extern String output[10][10];    // 输出旋转后的二维 String 数组
extern String id_w[10][10];
extern String id_b[10][10];
extern String lastMovesstart[2]; // 假设每步棋用一个字符串表示（你可以根据实际情况调整类型）
extern String lastMovesend[2];
extern String lastMovesstart[2]; // 存储每步棋的起始位置，例如 "E2"
extern String lastMovesend[2];   // 存储每步棋的结束位置，例如 "E4"
extern int lastMovesMagn[2];     // 存储每步棋所使用的电磁铁编号
// 定义一个 10x10 的网格（棋盘），每个单元格是一个 String 类型
extern const String grid[10][10];
extern String idBoard[10][10]; // 棋子id
extern String id_board;
extern String QW;
extern String QB;
// extern const int moveCount;

// 棋子轨迹记录
struct PieceRecord
{
    String start; // 首次出现位置
    String end;   // 最后一次位置
    int magnet;
};
extern std::map<String, PieceRecord> pieceRecords;

struct FenPosition
{
    String piece;
    String gridPos;
};

struct MoveOperation
{
    String piece;
    String from;
    String to;
    int magnetNum;
};

// 定义棋步结构体
struct ChessMove
{
    String piece;    // 新增：棋子名称
    String startPos; // 起始位置
    String endPos;   // 结束位置
    int magnetNum;
};

// 定义结构体 GridPosition，用于存储网格位置的行列坐标
struct GridPosition
{
    int row; // 行坐标
    int col; // 列坐标
};

void print2DArray_char(char arr[][10], int rows, int cols);
void print2DArray_string(String arr[][10], int rows, int cols);

// 将一维数组转换为二维数组
// arr1D: 输入的一维数组
// arr2D: 输出的二维数组（10x10）
// rows: 二维数组的行数
// cols: 二维数组的列数
void convert1DTo2D(char arr1D[], char arr2D[][10], int rows, int cols);

// 将字符串转换为二维字符数组
// str: 输入的字符串
// arr2D: 输出的二维字符数组（10x10）
// rows: 二维数组的行数
// cols: 二维数组的列数
void convertStringTo2D(String str, char arr2D[][10], int rows, int cols);

// 旋转二维数组90度
// input: 输入的二维数组（10x10）
// output: 输出的旋转后的二维数组（10x10）
void rotate90Degrees(char input[10][10], char output[10][10]);

// 对二维数组进行水平翻转
// input: 输入的二维数组（10x10）
// output: 输出的水平翻转后的二维数组（10x10）
void flipHorizontally(char input[10][10], char output[10][10]);

// 复制二维数组的内容到另一个二维数组
// input: 输入的二维数组（10x10）
// output: 输出的二维数组（10x10）
void copyArray(char input[10][10], char output[10][10]);

// 获取给定位置（字符串形式）的网格索引
// pos: 给定的网格位置（例如 "a1", "b2" 等）
// 返回值: 对应位置的网格索引（以整数表示，可能需要根据具体实现来处理）
int getGridIndex(const char *pos);

// 优化的查找函数，返回给定位置的二维坐标
// pos: 给定的网格位置（例如 "a1", "b2" 等）
// 返回值: 对应的网格坐标，包含行和列信息
GridPosition getGridCoordinates(const String &pos);

// 删除棋子
// position: 要删除棋子的位置
void deletePiece(String position);

// 检查棋子是否到达指定位置
// position: 要检查的位置
// 返回值: 如果棋子到达了指定位置，返回 true，否则返回 false
bool checkIfMovedToPosition(String position);

// 旋转二维 String 数组 270 度
// input: 输入的二维 String 数组（10x10）
// output: 输出的旋转后的二维 String 数组（10x10）
void rotate270Degrees(String input[10][10], String output[10][10]);

// 打印二维 String 数组
// Array: 输入的二维 String 数组（10x10）
void printStringArray(String Array[10][10]);

// 将 String 数组转换为二维字符数组
// idBoard: 输入的 String 数组
// charArray: 输出的二维字符数组（10x10）
// size: String 数组的大小
void convertStringToCharArray(String idBoard[], String charArray[10][10], int size);

String *checkIfPieceAtPosition(int row, int col);
GridPosition checkEmpty_b_p();
GridPosition checkEmpty_w_p();
GridPosition checkEmpty_b_9();
GridPosition checkEmpty_b_0();
GridPosition checkEmpty_w_9();
GridPosition checkEmpty_w_0();
String verifyPieceStatus();
void transformBoard();
void resetBoard();
void recordMove(String start, String end, int magn);

void drawCircle(float center_x, float center_y, float radius, int segments);

void drawSquare(float start_x, float start_y, float side_length);

void drawTriangle(float start_x, float start_y, float side_length);

float runRoundTripWithSpeed(float start_x, float start_y, float end_x, float end_y, int cycles, int magnet_num);

void flushQueue(QueueHandle_t queue);
void addPiece(String position, String piece);

ChessMove getMoveHistory(int stepsBack);
void logMove(String piece, String start, String end, int magnet);

String returnPiece(String position);

void printPieceJourneys();
void clearMoveHistory(int number);
bool checkIfEmpty(String position);
String lookupIdInGridRange();
int processString_alt(String str);
bool verifyMoveApplied(const char before[10][10], const char after[10][10], int startPosAlt, int endPosAlt);
#endif // CHESSBOTBOARD_22_MIDDLE_H
